<?php
set_time_limit ( 1800 ); //On change le time out de l'interpreteur php
/*********************************Connexion à la bdd*****************************/
$PARAM_hote = 'localhost';
$PARAM_utilisateur = 'root';
$PARAM_mot_passe = 'password';
$PARAM_nom_bd = 'serveurlicence';
$connexion = new PDO ( 'mysql:host=' . $PARAM_hote . ';dbname=' . $PARAM_nom_bd, $PARAM_utilisateur, $PARAM_mot_passe );
/******************************Création objet SoAPI de ovh pour accèder à leurs méthodes******************************/
$soap = new SoapClient ( "https://www.ovh.com/soapi/soapi-re-1.63.wsdl" );
// login
$session = $soap->login ( "df44485-ovh", "53aCt5Se", "fr", false );
/*****************************Préparation des requête pour une execution plus rapide************************************/
$requete = 'SELECT id, nom, prenom FROM praticiens';
$requeteInsert = 'INSERT INTO gestsmsclients VALUES (null,:id, :Nom, :Prenom, :DateMAJ, :MoisConcerne, :NbSMSMoisConcerne,:cout,NULL)';
$requeteUpdate = "UPDATE gestsmsclients SET DateMAJ=:datemaj, NbSMSMoisConcerne=:newnbsms,Cout=:cout WHERE idPraticien=:id AND CONCAT(YEAR(MoisConcerne),MONTH(MoisConcerne))=:mois";
$requeteCheck = 'SELECT * FROM gestsmsclients WHERE idPraticien=:id AND CONCAT(YEAR(MoisConcerne),MONTH(MoisConcerne))=:mois';
$requeteTarif = 'SELECT t.tarif FROM tarifsms t INNER JOIN datetarif d on t.IdDate=d.id WHERE :nbsms=t.qteSMS AND EXTRACT(YEAR_MONTH FROM d.Date)<=:date ORDER BY d.Date ;';
$result = $connexion->prepare ( $requete );
$insertion = $connexion->prepare ( $requeteInsert );
$maj = $connexion->prepare ( $requeteUpdate );
$check = $connexion->prepare ( $requeteCheck );
$Tarif = $connexion->prepare ( $requeteTarif );
/**************************** Initialisation des variables *********************************/
$nbSmsPratMoisPrec = 0;
$CoutSMS=0.0;
$CheckExist = 0;
$moisConcerne = date ( 'Y-m-d', mktime ( 0, 0, 0, date ( 'm' ), date ( 'd' ), date ( 'Y' ) ) );//!!!Important!!! Format pour compatibilité SQL
$YmConcat=date ( 'Y', mktime ( 0, 0, 0, date ( 'm' ), date ( 'd' ), date ( 'Y' ) ) )."".ltrim(date ( 'm', mktime ( 0, 0, 0, date ( 'm' ), date ( 'd' ), date ( 'Y' ) ) ),"0") ; //!!!Important!!! Format pour compatibilité SQL
$Ym= date ( 'Ym', mktime ( 0, 0, 0, date ( 'm' ), date ( 'd' ), date ( 'Y' ) ) );//!!!Important!!! Format pour compatibilité SQL
$result->execute ();
if (! $result) {
	echo '<tr>Aucune licence trouvée</tr>';
} else {
	while ( $data = $result->fetch ( PDO::FETCH_OBJ ) ) {
		/****************Se référer à la fonction nbSmsPrat***********************/
		$nbSmsPratMoisPrec = nbSmsPrat ( $data->id, $soap, $session,$Ym );
		/*******************************traitement du nombre de sms envoyés pour leurs affecter un tarif*****************************/
		if($nbSmsPratMoisPrec<=99) $nbsmsPrat=99;
		if($nbSmsPratMoisPrec<=199 && $nbSmsPratMoisPrec>99) $nbsmsPrat=199;
		if($nbSmsPratMoisPrec<=499 && $nbSmsPratMoisPrec>199) $nbsmsPrat=499;
		if($nbSmsPratMoisPrec<=999 && $nbSmsPratMoisPrec>499) $nbsmsPrat=999;
		if($nbSmsPratMoisPrec>=1000) $nbsmsPrat=1000;
		if ($nbSmsPratMoisPrec != 0) {
			$Tarif->execute ( array (
					":nbsms" => $nbsmsPrat,
					":date" => $Ym
						) );
			/**********************Parcours de tous les tarifs, on prend celui le plus récent (le dernier de la liste dans ce cas)******************************/
			while($TarifSMS=$Tarif->fetch()){
				$TarifFinal=$TarifSMS['tarif'];
			}
			$CoutSMS=$TarifFinal*$nbSmsPratMoisPrec; // Calcul du Cout total des sms
			$check->execute ( array (
					":id" => $data->id,
					":mois" => $YmConcat
			) );
			$CheckExist = $check->rowCount ();
			/*****************************Mise à jour ou insertion des données SMS***********************************/
			if ($CheckExist >= 1) {
				$maj->execute ( array (
						":datemaj" => $moisConcerne,
						":newnbsms" => $nbSmsPratMoisPrec,
						":cout"=>$CoutSMS,
						":id" => $data->id,
						":mois" =>$YmConcat
				) );
				$maj->closeCursor (); //!!!!IMPORTANT!!!!! Permet d'éxécuter à nouveau la requête avec des données différentes 
			} else {				
				$insertion->execute ( array (
						":id" => $data->id,
						":Nom" => $data->nom,
						":Prenom" => $data->prenom,
						":DateMAJ" => $moisConcerne,
						":MoisConcerne" => $moisConcerne,
						":NbSMSMoisConcerne" => $nbSmsPratMoisPrec,
						":cout"=>$CoutSMS
				) );
			}
			$insertion->closeCursor ();//!!!!IMPORTANT!!!!! Permet d'éxécuter à nouveau la requête avec des données différentes 
			$check->closeCursor ();//!!!!IMPORTANT!!!!! Permet d'éxécuter à nouveau la requête avec des données différentes 
			$Tarif->closeCursor();//!!!!IMPORTANT!!!!! Permet d'éxécuter à nouveau la requête avec des données différentes 
		}
	}
}
$result->closeCursor ();//!!!!IMPORTANT!!!!! Permet d'éxécuter à nouveau la requête avec des données différentes 
$soap->logout ( $session );//Log out SoApi OVH


/*Prend en paramètre l'id d'un praticien, une date sous la forme AAAAMM, l'objet SoApi d'OVH et sont identifiant de session 
*Retourne le nombre de sms envoyé pour le mois passé en paramètre
*/
function nbSmsPrat($id, $soap, $session, $mois) {
	$nbsms = 0;
	try {
		$return = array ();
		// telephonySmsHistory-------> retourne l'historique de tout les sms envoyés 
		$result = $soap->telephonySmsHistory ( $session, "sms-df44485-1", "", "$id", "", "", "", "", "", "" );
		/*********************Compte de tous les sms du pour le client(plus exactement les lignes du tableau renvoyé par SoApi)**********************/
		$size = count ( $result );
		for($i = 0; $i < $size; $i ++) {
			if (substr ( $result [$i]->date, 0, 6 ) == $mois) {
				$nbsms ++;
			}
		}
		return $nbsms;
	} catch ( SoapFault $fault ) {
		return 'Erreur SoApi OVH, surement à cause du stagiaire';
	}
}
function utf8_encode_array($array) {
	return utf8_encode ( $array );
}
?>